package com.starrocks.adapter;

import com.starrocks.entity.SyncConfigEntity;
import com.starrocks.entity.SyncTableConfig;
import com.starrocks.entity.SyncTargetEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 同步配置适配器
 * 将数据库中的配置实体转换为内部使用的配置对象
 */
public class SyncConfigAdapter {
    
    /**
     * 将数据库配置转换为同步表配置列表
     * 一个源表可能对应多个目标表，所以会生成多个 SyncTableConfig
     */
    public static List<SyncTableConfig> convertToSyncTableConfigs(SyncConfigEntity entity) {
        List<SyncTableConfig> configs = new ArrayList<>();
        
        if (entity == null || entity.getTargets() == null || entity.getTargets().isEmpty()) {
            return configs;
        }
        
        // 为每个目标表创建一个 SyncTableConfig
        for (SyncTargetEntity target : entity.getTargets()) {
            if (!target.getEnabled()) {
                continue; // 跳过禁用的目标表
            }
            
            SyncTableConfig config = new SyncTableConfig();
            
            // 源表信息
            config.setSourceTableName(entity.getSourceTableName());
            config.setPrimaryKey(entity.getPrimaryKey());
            config.setUpdateTimeField(entity.getUpdateTimeField());
            config.setEnabled(entity.getEnabled());
            config.setBatchSize(entity.getBatchSize());
            config.setFullSyncOnStartup(entity.getFullSyncOnStartup());
            
            // 目标表信息
            config.setTargetTableName(target.getTargetTableName());
            
            // 目标表主键（如果为空则使用源表主键）
            config.setTargetPrimaryPrimaryKey(target.getTargetPrimaryKey());
            // 需要通过 field mapping 转换主键
            config.setFieldMapping(target.getFieldMappingMap());
            
            // 同步字段列表
            config.setSyncFields(target.getSyncFieldsList());
            
            // ID生成策略
            config.setUseTargetId(target.getUseTargetId() != null ? target.getUseTargetId() : false);
            config.setIdGenerateStrategy(target.getIdGenerateStrategy());
            
            // 软删除配置
            config.setUseSoftDelete(target.getUseSoftDelete() != null ? target.getUseSoftDelete() : false);
            
            // 源表软删除字段名（从源表配置中获取，为 null 时后续处理会使用默认值 "is_delete"）
            config.setDeleteField(entity.getDeleteField());
            
            configs.add(config);
        }
        
        return configs;
    }
    
    /**
     * 批量转换多个配置
     */
    public static List<SyncTableConfig> convertToSyncTableConfigs(List<SyncConfigEntity> entities) {
        List<SyncTableConfig> allConfigs = new ArrayList<>();
        
        for (SyncConfigEntity entity : entities) {
            allConfigs.addAll(convertToSyncTableConfigs(entity));
        }
        
        return allConfigs;
    }
}

